Git 的 SSH KEY 配置

生成SSH Key

  • 生成SSH KEY: ssh-keygen -t rsa -C "your_email@example.com" , 然后会提示输入公钥的名字,如果你需要多个SSH-KEY(比如有多个github帐号)就需要在命名的时候区分一下,这样在/用户HOME目录/.ssh/文件夹下生成两个文件:xxx_rsa.pub和 xxx_rsa,分别是你的公钥和私钥。
  • 生成SSH KEY的时候还要求输入私钥密码 “Enter passphrase (empty for no passphrase):”, 请记住私钥的密码,后面会用到。
  • 将SSH 私钥增加到ssh-agent: ssh-add ~/.ssh/id_rsa, 这里会提示输入一次私钥的密码;
  • 查看已经add的SSH KEY: ssh-add -l
  • 如果提示 ssh agent没启动: eval ssh-agent -s
  • 非必要步骤: 安装xclip(终端到剪切板的工具): sudo yum install xclip , 将公钥内容拷贝到剪切板: xclip -sel clip < ~/.ssh/id_rsa.pub
  • 浏览器登录自己的github页面,进入”Account Settings”,再点击左边的”SSH Key”可以看到自己上传过的SSH公钥列表。再点击”Add SSH Key”新增一个公钥,把公钥(~/.ssh/id_rsa.pub) 文件内容粘贴过来。

测试SSH Key登录

  • 打开终端, 测试: ssh -T git@github.com;
    你可能会看到下面的错误信息:

Agent admitted failure to sign using the key.
debug1: No more authentication methods to try.
Permission denied (publickey).

上面的错误在某些Linux发行版(比如我的Fedora 17)是一个已知的错误, 可以忽略。
然后会看到打印出公钥的指纹,请确认此指纹和你公钥的一致,然后输入”yes”确认。

“ Hi your_name! You’ve successfully authenticated, but GitHub does not provide shell access.”

如果your_name正确显示你的ID,则说明成功设置了SSH公钥.

一台机器上管理多个SSH Key

如果你在一台机器使用两个github账号(比如私人账号和工作账号), 两个帐号用不同的SSH KEY,还需要编辑一下配置文件~/.ssh/config:

Host code.company.com
HostName code.company.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/key_for_company

Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/key_for_github

解释此配置文件:

  • HostName:比如我工作的git仓储地址是`git@code.company.com:username/repo_name.git, 那么我的HostName就要填code.company.com`;
  • IdentityFile: 所使用的公钥文件;

配置完毕,用下面的命令测试一下:

ssh -vT git@github.com
Hi xyz! You've successfully authenticated, but GitHub does not provide shell access.

注: @符号后面的”github.com”就是在~/.ssh/config文件中指定的Host

(1) 为已经clone下来的repos指定ssh-key:

在已经检出的repos目录下执行:

git config user.name your_name && git config user.email your_email

上面git config只对该项目生效

修改.git/config并找到[remote "origin"],修改url的值为:

[remote "origin"]
url = git@github.com:<user_name>/<repos_name>.git

(2) 使用指定ssh-key 重新clone一个reop:

  1. 使用指定账号clone:
    执行git clone git@github.com:user_name/repos_name.git

git clone git@github.com:user_name/repos_name.git
Cloning into ‘repos_name’…

  1. 然后还需要config一下user.name和user.email, 进入本地git仓库目录执行:
git config user.name your_name && git config user.email your_email

以后在此repos下执行git push origin master就是使用指定的用户push.


参考:

《Quick Tip: How to Work with GitHub and Multiple Accounts》
《Multiple SSH Keys settings for different github account》
《多个github帐号的SSH key切换》
《GitHub: Generating SSH Keys》